from datetime import date, timedelta

from rest_framework.generics import GenericAPIView
from rest_framework.response import Response
from rest_framework.views import APIView
from apps.meiduo_admin.serializers.home import CategorySerializer
from apps.goods.models import GoodsVisitCount
from apps.users.models import User

"""
APIView
GenericAPIView
ListAPIView
ModelViewSet
"""

from rest_framework.permissions import IsAdminUser  # 添加权限


class TotalUserCountAPIView(APIView):
    permission_classes = [IsAdminUser]

    def get(self, request):
        count = User.objects.all().count()
        return Response({'count': count})


# 当天新增用户
class DailyUserAddCountAPIView(GenericAPIView):
    permission_classes = [IsAdminUser]

    def get(self, request):
        # 查询 注册用户的 注册日期 大于等于今天就可以了
        # 1.获取当天的日期
        today = date.today()
        # 2.过滤查询
        count = User.objects.filter(date_joined__gte=today).count()
        return Response({
            'count': count
        })


# 当天活跃用户
class DailyUserActiveCountAPIView(GenericAPIView):
    permission_classes = [IsAdminUser]

    def get(self, request):
        # 查询 注册用户的 注册日期 大于等于今天就可以了
        # 1.获取当天的日期
        # date
        # 2020-02-13 00:00:00 到 2020-02-13 00:00:00
        # datetime  last_login
        today = date.today()
        # 2.过滤查询
        count = User.objects.filter(last_login__gte=today).count()
        return Response({
            'count': count,
            'date': today
        })


# # 下单用户数量统计
class UserDailyOrderCountAPIView(APIView):
    def get(self, request):
        today = date.today()
        # 1本书 n个人物
        # BookInfo.objects.filter(peopleinfo__description__contains='八')
        count = User.objects.filter(orderinfo__create_time__gte=today).distinct().count()
        return Response({
            'count': count,
            'date': today
        })


# 月增数量统计
class MonthUserCountAPIView(APIView):
    def get(self, request):
        """
        1.获取当天的日期       01.31
        2.获取30天前的日期     01.01
        3.再遍历 获取每一天的 用户量
            用户量是 获取1月1日  01:01 00:00:00  ~  01:02 00:00:00
            01.01   20
            01.02   22
            01.03   120
            01.04   200
            ....

        :param request:
        :return:
        """
        # 1.获取当天的日期       01.31
        today = date.today()
        # 2.获取30天前的日期     01.01
        start_date = today - timedelta(days=30)
        data_list = []
        # 3.再遍历 获取每一天的 用户量, range改成31则是包括了今天，不然是今天之前的
        for i in range(30):
            # 用户量是 获取1月1日  01:01(begin)　0点~01:02(end)　0点
            # 用户量是 获取1月2日  01:02 00:00:00  ~  01:03 00:00:00
            begin_date = start_date + timedelta(days=i)  # 1.2
            end_date = start_date + timedelta(days=(i + 1))  # 1.3
            count = User.objects.filter(date_joined__gte=begin_date,
                                        date_joined__lt=end_date).count()
            data_list.append({
                'date': begin_date,
                'count': count
            })
        return Response(data_list)

"""
Step 1: 日分类商品访问量数据的分析
Step 2: 查询数据
Step 3: 定义序列化器

APIView         不使用序列号器
GenericAPView   使用序列号器
ListAPIView     和我们讲课分析的思路是一样的
ModelViewSet    增删改查
如何选取 视图
真不知道选择哪个试图的时候 我们就选基类 APIView
"""


# 日分类访问量
class CategoryAPIView(APIView):
    def get(self, request):
        # 1.获取日期
        today = date.today()
        # 2.查询数据 [GoodsVisitCount,GoodsVisitCount...]
        gvc = GoodsVisitCount.objects.filter(date__gte=today)
        # 3.对对象列表转换为字典列表
        serializer = CategorySerializer(gvc, many=True)
        # 4.返回相应
        return Response(serializer.data)
